package distribuidos.dao;

import java.sql.Connection;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;

import distribuidos.dao.BaseDAO;
import distribuidos.excepcion.DAOExcepcion;
import distribuidos.modelo.*;
import distribuidos.util.ConexionBD;


public class PersonaDAO extends BaseDAO {

	public int insertar(Persona po) throws DAOExcepcion {
		int idp=0;
		System.out.println("PersonaDAO: insertar(Persona vo)");
		String query = "INSERT INTO persona(nombres,ape_paterno, ape_materno,fec_nacimiento,genero,telefono,celular,"
				+ "correo,direccion,tipo_documento, nro_documento,id_usuario,id_pais,id_departamento,id_distrito,estado) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, po.getNombres());
			stmt.setString(2, po.getApe_paterno());
			stmt.setString(3, po.getApe_materno());
			stmt.setDate(4, po.getFec_nacimiento());
			stmt.setString(5, po.getGenero());
			stmt.setString(6, po.getTelefono());
			stmt.setString(7, po.getCelular());
			stmt.setString(8, po.getCorreo());
			stmt.setString(9, po.getDireccion());
			stmt.setString(10, po.getTipo_documento());
			stmt.setString(11,po.getNro_documento());
			stmt.setInt(12, po.getId_usuario());
			stmt.setInt(13, po.getId_pais());
			stmt.setInt(14, po.getId_departamento());
			stmt.setInt(15, po.getId_distrito());
			stmt.setInt(16, po.getEstado());
			int i = stmt.executeUpdate();
			
			
			query = "SELECT LAST_INSERT_ID()";
			stmt = con.prepareStatement(query);
			rs = stmt.executeQuery();
			if (rs.next()) {
				idp = rs.getInt(1);
			}
			
			if (i != 1) {
				throw new SQLException("No se pudo insertar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return idp;
	}


	public Collection<Persona> buscarPorNombre(String nombre)

	throws DAOExcepcion {
		/* tipo_documento nro_documento */
		System.out.println("PersonaDAO: buscarPorNombre(String nombre)");

		String query = "SELECT id_persona, nombres, ape_paterno, ape_materno, "
				+ "fec_nacimiento, genero, telefono, celular, correo, "
				+ "direccion,tipo_documento, nro_documento, id_usuario, id_pais, Id_departamento, Id_distrito, "
				+ "estado " + "FROM persona WHERE estado = 1 and nombre like ?";

		Collection<Persona> lista = new ArrayList<Persona>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, "%" + nombre + "%");
			rs = stmt.executeQuery();
			while (rs.next()) {
				Persona vo = new Persona();
				vo.setId_persona(rs.getInt("id_persona"));
				vo.setNombres(rs.getString("nombre"));
				vo.setApe_paterno(rs.getString("ape_paterno"));
				vo.setApe_materno(rs.getString("ape_materno"));
				vo.setFec_nacimiento(rs.getDate("fec_nacimiento"));
				vo.setGenero(rs.getString("genero"));
				vo.setTelefono(rs.getString("telefono"));
				vo.setCelular(rs.getString("Celular"));
				vo.setCorreo(rs.getString("correo"));
				vo.setDireccion(rs.getString("direccion"));
				vo.setTipo_documento(rs.getString("tipo_documento"));
				vo.setNro_documento(rs.getString("nro_documento"));
				vo.setId_usuario(rs.getInt("id_usuario"));
				vo.setId_pais(rs.getInt("id_Pais"));
				vo.setId_departamento(rs.getInt("id_departamento"));
				vo.setId_distrito(rs.getInt("id_distrito"));
				vo.setEstado(rs.getInt("estado"));
				lista.add(vo);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return lista;
	}

	public Collection<Persona> listar() throws DAOExcepcion {
		System.out.println("PersonaDAO: listar()");
		Collection<Persona> c = new ArrayList<Persona>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			String query = "SELECT id_persona, nombres, ape_paterno, ape_materno, fec_nacimiento, "
					+ "genero, telefono, celular, correo, direccion,tipo_documento, nro_documento, id_usuario, id_pais, "
					+ "id_departamento, id_distrito, estado " + "FROM persona" 
					+ "WHERE estado = 1 ";
			stmt = con.prepareStatement(query);
			rs = stmt.executeQuery();
			while (rs.next()) {
				Persona vo = new Persona();
				vo.setId_persona(rs.getInt("id_persona"));
				vo.setNombres(rs.getString("nombres"));
				vo.setApe_paterno(rs.getString("ape_paterno"));
				vo.setApe_materno(rs.getString("ape_materno"));
				vo.setFec_nacimiento(rs.getDate("fec_nacimiento"));
				vo.setGenero(rs.getString("genero"));
				vo.setTelefono(rs.getString("telefono"));
				vo.setCelular(rs.getString("Celular"));
				vo.setCorreo(rs.getString("correo"));
				vo.setDireccion(rs.getString("direccion"));
				vo.setTipo_documento(rs.getString("tipo_documento"));
				vo.setNro_documento(rs.getString("nro_documento"));
				vo.setId_usuario(rs.getInt("id_usuario"));
				vo.setId_pais(rs.getInt("id_Pais"));
				vo.setId_departamento(rs.getInt("id_departamento"));
				vo.setId_distrito(rs.getInt("id_distrito"));
				vo.setEstado(rs.getInt("estado"));
				c.add(vo);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return c;
	}

	public void actualizar(Persona vo) throws DAOExcepcion {
		System.out.println("PersonaDAO: actualizar(Persona vo) "+  vo.getNro_documento());
		String query = "update persona set  nombres 	= ?, " +
				        "ape_paterno    = ?," +
				        "ape_materno    = ?," +
				        "fec_nacimiento = ?," +
				        "genero         = ?," +
				        "telefono       = ?," +
				        "celular        = ?," +
				        "correo         = ?," +
				        "direccion      = ?," +
				        "tipo_documento = ?," +
				        "nro_documento  = ?," +
				        "id_pais        = ?," +
				        "Id_departamento= ?," +
				        "id_distrito    = ?   where id_persona =?";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			
			stmt.setString(1, vo.getNombres());
			stmt.setString(2, vo.getApe_paterno());
			stmt.setString(3, vo.getApe_materno());
			stmt.setDate(4, vo.getFec_nacimiento()); // ojo con la fecha
			stmt.setString(5, vo.getGenero());
			stmt.setString(6, vo.getTelefono());
			stmt.setString(7, vo.getCelular());
			stmt.setString(8, vo.getCorreo());
			stmt.setString(9, vo.getDireccion());
			stmt.setString(10, vo.getTipo_documento());
			stmt.setString(11, vo.getNro_documento());
			stmt.setInt(12, vo.getId_pais());
			stmt.setInt(13, vo.getId_departamento());
			stmt.setInt(14, vo.getId_distrito());
			stmt.setInt(15, vo.getId_persona());
			
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo actualizar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}

	public void eliminar(String nro) throws DAOExcepcion {
		System.out.println("PersonaDAO: eliminar(String Nombre)");
		String query = "update persona set estado = 0 where nro_documento = ?";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, nro);

			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo eliminar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}

	public Persona obtener(String nombre) throws DAOExcepcion {
		System.out.println("personaDAO: obtener(String Nombre)");
		Persona vo = new Persona();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			String query = "SELECT id_persona, nombres, ape_paterno, ape_materno, fec_nacimiento, genero, "
					+ "telefono, celular, correo, direccion,tipo_documento, nro_documento, id_usuario, id_pais, id_departamento, "
					+ "id_distrito, estado FROM persona "
					+ "WHERE nombres like ?";
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, nombre);

			rs = stmt.executeQuery();
			if (rs.next()) {
				vo.setId_persona(rs.getInt("id_persona"));
				vo.setNombres(rs.getString("nombres"));
				vo.setApe_paterno(rs.getString("ape_paterno"));
				vo.setApe_materno(rs.getString("ape_materno"));
				vo.setFec_nacimiento(rs.getDate("fec_nacimiento"));
				vo.setGenero(rs.getString("genero"));
				vo.setTelefono(rs.getString("telefono"));
				vo.setCelular(rs.getString("celular"));
				vo.setCorreo(rs.getString("correo"));
				vo.setDireccion(rs.getString("direccion"));
				vo.setTipo_documento(rs.getString("tipo_documento"));
				vo.setNro_documento(rs.getString("nro_documento"));
				vo.setId_usuario(rs.getInt("id_usuario"));
				vo.setId_pais(rs.getInt("id_Pais"));
				vo.setId_departamento(rs.getInt("id_departamento"));
				vo.setId_distrito(rs.getInt("id_distrito"));
				vo.setEstado(rs.getInt("estado"));
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return vo;
	}

	public Persona obtenerXDNI(String nro) throws DAOExcepcion {
		System.out.println("personaDAO: obtener(int id)");
		Persona vo = new Persona();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			String query = "SELECT id_persona, nombres, ape_paterno, ape_materno, fec_nacimiento, genero, "
					+ "telefono, celular, correo, direccion,tipo_documento, nro_documento, id_usuario, id_pais, id_departamento, "
					+ "id_distrito, estado FROM persona "
					+ "WHERE nro_documento = ?";
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, nro);

			rs = stmt.executeQuery();
			if (rs.next()) {
				vo.setId_persona(rs.getInt("id_persona"));
				vo.setNombres(rs.getString("nombres"));
				vo.setApe_paterno(rs.getString("ape_paterno"));
				vo.setApe_materno(rs.getString("ape_materno"));
				vo.setFec_nacimiento(rs.getDate("fec_nacimiento"));
				vo.setGenero(rs.getString("genero"));
				vo.setTelefono(rs.getString("telefono"));
				vo.setCelular(rs.getString("celular"));
				vo.setCorreo(rs.getString("correo"));
				vo.setDireccion(rs.getString("direccion"));
				vo.setTipo_documento(rs.getString("tipo_documento"));
				vo.setNro_documento(rs.getString("nro_documento"));
				vo.setId_usuario(rs.getInt("id_usuario"));
				vo.setId_pais(rs.getInt("id_Pais"));
				vo.setId_departamento(rs.getInt("id_departamento"));
				vo.setId_distrito(rs.getInt("id_distrito"));
				vo.setEstado(rs.getInt("estado"));
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return vo;
	}

	public Persona buscarXIdP(int id) throws DAOExcepcion {
			System.out.println("personaDAO: obtener(String Nombre)");
			Persona vo = new Persona();
			Connection con = null;
			PreparedStatement stmt = null;
			ResultSet rs = null;
			try {
				String query = "SELECT id_persona,id_usuario, nombres, ape_paterno, ape_materno, fec_nacimiento, genero, " +
							   "telefono, celular, correo, direccion,tipo_documento, nro_documento, id_pais, id_departamento, " +
							   "id_distrito, estado FROM persona " +
							   "WHERE id_persona = ? and estado=1";
				con = ConexionBD.obtenerConexion();
				stmt = con.prepareStatement(query);
				stmt.setInt(1, id);
				rs = stmt.executeQuery();
				if (rs.next()) {
					vo.setId_persona(rs.getInt("id_persona"));
					vo.setId_usuario(rs.getInt("id_usuario"));
					vo.setNombres(rs.getString("nombres"));
					vo.setApe_paterno(rs.getString("ape_paterno"));
					vo.setApe_materno(rs.getString("ape_materno"));
					vo.setFec_nacimiento(rs.getDate("fec_nacimiento"));
					vo.setGenero(rs.getString("genero"));
					vo.setTelefono(rs.getString("telefono"));
					vo.setCelular(rs.getString("celular"));
					vo.setCorreo(rs.getString("correo"));
					vo.setDireccion(rs.getString("direccion"));
					vo.setTipo_documento(rs.getString("tipo_documento"));
					vo.setNro_documento(rs.getString("nro_documento"));
					vo.setId_pais(rs.getInt("id_Pais"));
					vo.setId_departamento(rs.getInt("id_departamento"));
					vo.setId_distrito(rs.getInt("id_distrito"));
					vo.setEstado(rs.getInt("estado"));
				}
			} catch (SQLException e) {
				System.err.println(e.getMessage());
				throw new DAOExcepcion(e.getMessage());
			} finally {
				this.cerrarResultSet(rs);
				this.cerrarStatement(stmt);
				this.cerrarConexion(con);
			}
			return vo;
		}			

	public Persona buscarXId(int id) throws DAOExcepcion {
		System.out.println("personaDAO: obtener(String Nombre)");
		Persona vo = new Persona();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			String query = "SELECT id_persona,id_usuario, nombres, ape_paterno, ape_materno, fec_nacimiento, genero, " +
						   "telefono, celular, correo, direccion,tipo_documento, nro_documento, id_pais, id_departamento, " +
						   "id_distrito, estado FROM persona " +
						   "WHERE id_usuario = ? and estado=1";
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, id);
			rs = stmt.executeQuery();
			if (rs.next()) {
				vo.setId_persona(rs.getInt("id_persona"));
				vo.setId_usuario(rs.getInt("id_usuario"));
				vo.setNombres(rs.getString("nombres"));
				vo.setApe_paterno(rs.getString("ape_paterno"));
				vo.setApe_materno(rs.getString("ape_materno"));
				vo.setFec_nacimiento(rs.getDate("fec_nacimiento"));
				vo.setGenero(rs.getString("genero"));
				vo.setTelefono(rs.getString("telefono"));
				vo.setCelular(rs.getString("celular"));
				vo.setCorreo(rs.getString("correo"));
				vo.setDireccion(rs.getString("direccion"));
				vo.setTipo_documento(rs.getString("tipo_documento"));
				vo.setNro_documento(rs.getString("nro_documento"));
				vo.setId_pais(rs.getInt("id_Pais"));
				vo.setId_departamento(rs.getInt("id_departamento"));
				vo.setId_distrito(rs.getInt("id_distrito"));
				vo.setEstado(rs.getInt("estado"));
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return vo;
	}	

	public Collection<Persona> buscarXPostulacion(int idoferta) throws DAOExcepcion {

		System.out.println("personaDAO: obtener(Int ID)");
		Collection<Persona> c = new ArrayList<Persona>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;

		try {	
			con = ConexionBD.obtenerConexion();
			String query = "SELECT pe.id_persona,nombres,ape_paterno,ape_materno, telefono, celular, correo, " +
					"nro_documento FROM postulante po inner join persona pe on po.id_persona=pe.id_persona" +
					"inner join postulantexoferta pxo on pxo.id_postulante=po.id_postulante where id_oferta='?'";
			stmt = con.prepareStatement(query);
			rs = stmt.executeQuery();
			while (rs.next()) {
				Persona vo = new Persona();
				vo.setId_persona(rs.getInt("id_persona"));
				vo.setNombres(rs.getString("nombres"));
				vo.setApe_paterno(rs.getString("ape_paterno"));
				vo.setApe_materno(rs.getString("ape_materno"));
				vo.setFec_nacimiento(rs.getDate("fec_nacimiento"));
				vo.setGenero(rs.getString("genero"));
				vo.setTelefono(rs.getString("telefono"));
				vo.setCelular(rs.getString("Celular"));
				vo.setCorreo(rs.getString("correo"));
				vo.setDireccion(rs.getString("direccion"));
				vo.setTipo_documento(rs.getString("tipo_documento"));
				vo.setNro_documento(rs.getString("nro_documento"));
				vo.setId_usuario(rs.getInt("id_usuario"));
				vo.setId_pais(rs.getInt("id_Pais"));
				vo.setId_departamento(rs.getInt("id_departamento"));
				vo.setId_distrito(rs.getInt("id_distrito"));
				vo.setEstado(rs.getInt("estado"));
				c.add(vo);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return c;
	}	
}


